Я понимаю, что это было задано и получено 3 года назад, но я столкнулся с ним, задавая себе тот же вопрос.Краткий ответ - да, конечно, потому что вы просто конвертируете один тип XML в другой (хотя и с некоторыми структурными и синтаксическими изменениями).Я видел это: https://www.oxygenxml.com/archives/xsl-list/200807/msg00601.html - который описывает базовую реализацию в качестве доказательства концепции, и я использовал ее в качестве отправной точки для создания следующего XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" />
<xsl:template match="/">
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:element name="xsl:stylesheet">
<xsl:namespace name="xsl" select="'http://www.w3.org/1999/XSL/Transform'" /> <xsl:attribute name="version" select="'1.0'" />
<xsl:element name="xsl:output">
<xsl:attribute name="indent" select="'yes'" />
<xsl:attribute name="method" select="'xml'" />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:comment> </xsl:comment>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'/'" />
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="'node()'" />
</xsl:element>
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="'node()'" />
<xsl:element name="xsl:if">
<xsl:attribute name="test" select="'.!='''" />
<xsl:element name="xsl:copy"></xsl:element>
</xsl:element>
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:comment> </xsl:comment>
<xsl:comment> ............................................................................................... </xsl:comment>
<xsl:apply-templates />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
</xsl:template>
<xsl:template match="xs:complexType[@name]">
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="@name" />
<xsl:apply-templates />
</xsl:element>
<xsl:comment> ............................................................................................... </xsl:comment>
</xsl:template>
<xsl:template match="xs:complexType[not(@*)]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!-- xsl:template match="xs:simpleType[@name]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
<xsl:apply-templates />
</xsl:element>
</xsl:template -->
<xsl:template match="xs:sequence">
<xsl:element name="xsl:copy">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="xs:element[@name]">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="@name" />
</xsl:element>
</xsl:template>
<xsl:template match="xs:attribute">
<xsl:element name="xsl:apply-templates">
<xsl:attribute name="select" select="concat( '@', @name )" />
</xsl:element>
</xsl:template>
<!-- xsl:template match="xs:element[@name]">
<xsl:text>

</xsl:text>
<xsl:element name="xsl:template">
<xsl:attribute name="match" select="@name" />
<xsl:text>
</xsl:text>
<xsl:comment>
auto generated stub for element <xsl:value-of select="@name" />
</xsl:comment>
<xsl:text>
</xsl:text>
</xsl:element>
<xsl:apply-templates />
</xsl:template -->
<xsl:template match="text()" />
</xsl:stylesheet>
Обратите внимание на использование xsl:element
для создания тегов XSLT и создания атрибутов select
и match
, цитирование в select и экранирование.Блоки comment
предназначены для того, чтобы визуально разбить корень документа (сделать его более читабельным), но не служат никакой другой цели.Кроме того, для этого требуется процессор XSLT 2.0.xsltproc
пользователям не нужно подавать заявку.
Согласно предыдущим ответам, вам придется изменить его в различной степени для вашего варианта использования.Я сделал это так, чтобы я мог быстро создать точный скелет, из которого я мог бы создать полезный документ XSLT, автоматизируя утомительную основу.
Естественно, я только что потратил часы на разработку и тестирование чего-то, что в этомпункт, который я, вероятно, мог бы сделать быстрее с помощью grep, но по крайней мере это было интересно.Надеюсь, что это кому-то поможет, и улучшения приветствуются.